iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
自我挑戰組

資料蒐集與分散式運算 30 天系列 第 21

[Day 21] Instagram - 模擬貼文 - 2

  • 分享至 

  • xImage
  •  

歡迎來到第 21 天,承接昨天解析 IG 發文流程的內容,今天將會完成發文前的準備,將瀏覽器更改為手機版。

更改 User-agent

由於發文功能只存在在手機模式,非手機模式的請求都不會在 Reponse 中存在發文的按鈕,因此要更改請求 header 中的 user-agent。更改 User-agent 有兩種方式,第一種是透過 chrome.options 的方式直接更改,就像在 [Day 12] 動態爬蟲 - 4 時設定隱藏視窗一樣進人設定。(User-agent 的部分就直接從 DevTool 中複製)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1")
chrome_options.add_argument("--window-size=375,812")
driver = webdriver.Chrome(executable_path = 'Path to webdriver',
                             options=chrome_options)
driver.get("https://www.instagram.com?hl=zh-tw")

執行以上程式碼後,可以從頁面上方的 App 安裝提示發現 IG 已經認為發出請求的裝置是手機裝置。也可以從 request headers 中觀察到 user-agent 為上述輸入的內容。

https://ithelp.ithome.com.tw/upload/images/20201004/20128931ACNNLmS4MZ.png

https://ithelp.ithome.com.tw/upload/images/20201004/20128931g2Y4XdcGs8.png

第二種方式是透過調用 Chrome DevTool Protocal 的方式進行更改。可以使用 Selenium 中函數 execute_cdp_cmd 進行調用。

driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"})

這兩者間的差異在於,第一種的方法必須要在啟動 Chrome Driver 時進行寫入,因此整個瀏覽器在關掉前,所有的 user-agent 都會一致。但第二種方式可以在任意時刻更改 user-agent,也意味著可以在每次的請求使用不同的 user-agent,較為靈活。可以看到在尚未調用 cdp 時 IG 的回應是一般用電腦登入時的畫面。

https://ithelp.ithome.com.tw/upload/images/20201004/20128931Zn5iGGZ1ey.png

但在調用 cdp 後重新訪問 IG,畫面就與手機上一模一樣。(可以觀察到視窗比例與第一案例不同源自於沒有再啟動 Driver 時設定任何參數)

https://ithelp.ithome.com.tw/upload/images/20201004/20128931sXYOqXB283.png

整合

將之前的模擬登入的程式碼做結合,即可以完成發文前準備

from time import sleep
from selenium import webdriver

driver = webdriver.Chrome(executable_path = 'Path to webdriver')
driver.get("https://www.instagram.com/?hl=zh-tw")
inputs = driver.find_elements_by_xpath("//input")
btn = driver.find_element_by_xpath("//button[@class='sqdOP  L3NKy   y3zKF     ']")
username = inputs[0]
password = inputs[1]
account = "帳號"   # 可以利用環境變數取代提高安全性
password = "密碼"  # 可以利用環境變數取代提高安全性

username.send_keys(account)
sleep(2) # 亦可以加入 random 隨意調整時間差
password.send_keys(password)
sleep(2) # 亦可以加入 random 隨意調整時間差
btn.click()

driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent":"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"})

driver.refresh()

https://ithelp.ithome.com.tw/upload/images/20201004/201289310DAIFE8JpH.png

今天就先到這邊,我們明天發文見!


上一篇
[Day 20] Instagram - 模擬發文 - 1
下一篇
[Day 22] Instagram - 模擬發文最終篇
系列文
資料蒐集與分散式運算 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言